#对于函数，函数内的代码前面要有一个缩进，表示这些代码是属于这个函数的
"""
def test():
    print("存款")
    print("取款")
    print("查询")
    print("取卡")

#def是函数创建的一个关键词

#那么我们在创建好函数之后我们怎么进行函数的使用呢？

#注意：函数不会主动进行编译的，需要我们手动进行调用的

#使用函数（调用函数）---函数名()

#对于这种调用的方法的话，我们之前的print() 和type()
#都是函数，只不过里面的代码我们是不需要写的，之前就写好了的，我们直接调用进行使用就行李科

test()
"""
#这里我们成功调用函数
'''
存款
取款
查询
取卡
'''

"""
students =[
{'name':'张三','password':123},
{'name':'王五','password':888},
{'name':'赵六','password':456}
]
"""
"""
name=input("请输入用户名：")
for i in students:
    #i存在的是用户的信息字典
    if name==i['name']:
        #对输入的用户名进行判断
        for n in range(1,4):
            #循环3次进行输入密码的操作，如果输入正确直接跳出循环
            pwd=eval(input("请输入密码："))
            if pwd==i['password']:
                print('登录成功')
                exit()
                #break#只能退出当前所在的循环，就是跳出了里面的循环，还是处于外部循环
            else:
                print(f'密码错误,还剩{3-n}次机会')
    #if name==i['name'] and pwd==i['password'] :
        #break
else:#循环正常结束执行，即没有break语句
    print("用户名不存在")
    #进行注册
    name=input("请输入注册的用户名：")
    
    p1=input("请输入密码：")
    p2=input("请再次输入密码：")
    if p1==p2:
        if p1.isdigit():#判断我们输入的是不是数字的形式           
            #我们将这个用户名和密码添加到这个列表中
            #用户名和密码组成一个字典
            #将这个字典以一个元素的形式添加到列表中去
            students.append({'name':name,'password':int(p1)})#p1是字符串我们得进行转换
    else:
        print("两次密码要一致")
"""
'''
#对于用户登录和用户注册我们是可以封装为两个函数的
students =[
{'name':'张三','password':'123'},
{'name':'王五','password':'888'},
{'name':'赵六','password':'456'}
]
#用户登录---log
def log():
    name=input("请输入用户名：")
    for i in students:
    #i存在的是用户的信息字典
        if name==i['name']:
            #对输入的用户名进行判断
            for n in range(1,4):
                #循环3次进行输入密码的操作，如果输入正确直接跳出循环
                pwd=input("请输入密码：")
                if pwd==i['password']:
                    print('登录成功')
                     #exit()
                    break#只能退出当前所在的循环，就是跳出了里面的循环，还是处于外部循环
                else:
                    print(f'密码错误,还剩{3-n}次机会')
        if name==i['name'] and pwd==i['password'] :
            break
    else:
        print("用户名不存在，请先注册")
#用户注册---reg
def reg():
        name=input("请输入注册的用户名：")
        while True:
            p1=input("请输入密码：")
            p2=input("请再次输入密码：")
            if p1==p2:
                    students.append({'name':name,'password':p1})#p1是字符串我们得进行转换
                    print("注册成功")#那么我们就不用再输入密码了，我们就退出这个循环就行了
                    break
            else:
                print("两次密码要一致")
#直到我们输入正确的密码之后我们就能跳出这个循环了


while True:
    n=input('1.登录   2.退出   3.提出\n请输入你要操作的内容')
    if n =='1':
        log()
    elif n=='2':
        reg()
    elif n=='3':
        print("退出")
        break
    else:
        print("请输入正确的序号")
'''
#现在我们定义一个加法的函数
'''
def Add(a,b):
    
    print(a+b)

a=int(input("输入a:"))
b=int(input("输入b:"))

Add(a,b)

#我们这里直接指定好参数
print(sep='\t',end='\n')

#指定传参，这样就可以不用一一对应了
Add(b=100,a=10)

'''
#默认参数
'''
def 函数名(形参=默认值，......):
    函数体

'''
"""
def func(name,sex='男'):
    print(f'我是{name}，性别：{sex}')

func("小黑")
#我是小黑，性别：男

#我们在这个函数的调用的时候我们只传了name"小黑"
#并没有传性别，因为我们性别在这个函数体中已经是默认的了

func("小美",'女')
"""

"""
#元组不定长---*args
def funa(*args):
    print(args)#传入的数据全部存放在args中

funa()
#()
#我们不传参的话那么就是打印一个括号

#我们这里args前面加上*，就像是之前的变量前面加上*就能接受所有剩余的数据
#就像拆包一样

funa(1)
#(1,)
#我们传参1
#我们这里打印出来的就是一个元组类型的数据

#我们这个就是将传入的实参全部接受，以元组的方式进行保存
#不管传多少都是不会进行报错的

#这个不定长的参数就是保障了我们不知道参数个数的情况下降参数进行保存下来

"""

"""
#字典不定长---**kwargs
#我们传入的数据以字典的方式进行存放
#字典{}
def funb(**kwargs):
    print(kwargs)

funb()
#以关键字传参---形参（键）==实参（值）
funb(name="小敏",age=18)
#{'name': '小敏', 'age': 18}

#格式就是函数名字(键1=值1，键2=值2)

"""
"""
#定义一个元组
t=(1,2,3)
def func(a,b,c):
    print(a,b,c,sep='\t')
    
#我们现在想让这个元组内的数据以实参的形式传到函数里面，那么该怎么操作呢？

#我们是可以使用拆包这个知识点
#拆包是存在两种形式的
#第一种：以变量的形式进行接收数据
'''
我们用变量的形式将这个元组内的数据依次进行接收
然后将这些变量以实参的形式传到这个函数里面
'''
x,y,z=t
func(x,y,z)
#1	2	3
#第二种：用*号进行接收
'''
在元组的名字前面加上*用于这个拆包，以实参的形式传到函数里面进行后续的操作
'''
func(*t)
#1	2	3

print(t)
#(1, 2, 3)

print(*t)
#1 2 3

#我们对元组进行拆包的操作之后我们就得到元组内的每个数据了
"""
"""
n='afasg'.upper()
print(n)
#AFASG
#那么这个就是这个函数的返回值
def testa():
    return  '返回一个数据'

print(testa())
#返回一个数据

#这个就是我们的函数返回值
#我们在函数里面设定好我们要返回的值
#那么这个函数在主函数里面的返回值就是我们设定的返回值

"""
'''
def testb():
    num=10
    print(f'testb:{num}')
testb()
#testb:10


def testc():
    print(f'testc:{num}')
testc()#这个是会报错的，因为我们这个函数里面的num对于这个函数是没有进行定义的

#局部作用域：定义在函数里面的变量
#除了这个作用域的变量就会销毁的

#就像这个testb里面的num是局部变量
#那么到testc里面就已经是被销毁的，

#这个变量是在testb里面进行定义的
#那么只能够作用于testb里面

#但是现在我就是想在test里面使用num该怎么做呢？

#只要testb函数主动出来，那么我们就能在testc里面进行num的使用

'''
'''
def testb():
    num=10
    print(f'testb:{num}')
    return num
testb()

def testc():
    num=testb()
    print(f'testc:{num}')
testc()
#testb:10
#testb:10
#testc:10
'''
'''
我们在先在testb这个函数将num进行返回的操作
然后在testc里面进行调用testb然后得到了num的值
然后我们再重新为num进行复制
那么我们最后就在testc里面将num进行打印了
'''
'''
def testb():
    global num#对变量进行声明，变量num为全局作用域
    num=10
    print(f'testb:{num}')
    return num
testb()

def testc():
    num=testb()
    print(f'testc:{num}')
testc()


def testd():
    print(f'testd:{num}')

testd()
#testd:10
#那么就说明num这个变量已经成为了个全局变量了
'''


'''
s=100
print(f's:{s}')

def set():
    s=10
    print(f'set:{s}')

set()
print(s)
'''
'''
s:100
set:10
100

'''

#对于函数调用的时候，如果使用到某一个变量的时候
#函数会自己进行检查空间内是否存在这个变量
#如果自己有就会用自己的
#自己没有的互就用字节的

'''
我们是可以从上面的代码看出来的
在函数里面的s大小是10
外面是100
所以说两个变量s根本不是一个东西
'''
'''
s=100
print(f's:{s}')

def set():

    print(f'set:{s}')

set()
print(s)
'''
'''
s:100
set:100
100
'''

s=100
print(f's:{s}')

def set():
    global s
    s-=10
    print(f'set:{s}')

set()
print(s)
'''
s:100
set:90
90
这里的s我们在函数的开头进行了全局作用域的声明了
那么函数在被调用的时候使用的变量就是全局的s
'''



































